package cn.tedu.mall.order.service.impl;

import cn.tedu.mall.common.exception.CoolSharkServiceException;
import cn.tedu.mall.common.pojo.domain.CsmallAuthenticationInfo;
import cn.tedu.mall.common.restful.JsonPage;
import cn.tedu.mall.common.restful.ResponseCode;
import cn.tedu.mall.order.mapper.OmsCartMapper;
import cn.tedu.mall.order.service.IOmsCartService;
import cn.tedu.mall.pojo.order.dto.CartAddDTO;
import cn.tedu.mall.pojo.order.dto.CartUpdateDTO;
import cn.tedu.mall.pojo.order.model.OmsCart;
import cn.tedu.mall.pojo.order.vo.CartStandardVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class OmsCartServiceImpl implements IOmsCartService {
    @Autowired
    private OmsCartMapper omsCartMapper;

    @Override
    public void addCart(CartAddDTO cartDTO) {
        //获取当前登录用户的id
        Long userId = getUserId();
        //查询这个用户是否已经将指定的sku添加到购物车
        OmsCart omsCart = omsCartMapper.selectSkuExistsCart(userId, cartDTO.getSkuId());
        //判断查询结果是否为空
        if(omsCart==null){
            //新增sku到购物车中
            //现在的参数是CartAddDTO类型，但是mapper层需要的是OmsCart类型的，需要类型转化
            OmsCart newOmsCart = new OmsCart();
            BeanUtils.copyProperties(cartDTO,newOmsCart);
            //cartDTO中没有userId的
            newOmsCart.setUserId(userId);
            //执行新增
            omsCartMapper.saveCart(newOmsCart);
        } else {
            //购物车中有sku商品，修改sku的数量
            //我们要做的是将omsCart对象中的quantity和cartDTO中的quantity相加，然后赋值给omsCart的属性
            omsCart.setQuantity(omsCart.getQuantity()+cartDTO.getQuantity());
            //调用修改购物车中sku数量的方法
            omsCartMapper.updateQuantityById(omsCart);
        }
    }
    //根据用户id分页查询当前用户购物车sku商品的列表
    @Override
    public JsonPage<CartStandardVO> listCarts(Integer page, Integer pageSize) {
        //PageHelper设置分页条件
        PageHelper.startPage(page,pageSize);
        //获取用户id
        Long userId = getUserId();
        //执行查询
        List<CartStandardVO> list = omsCartMapper.selectCartsByUserId(userId);
        return JsonPage.restPage(new PageInfo<>(list));
    }

    @Override
    public void removeCart(Long[] ids) {
        int rows = omsCartMapper.deleteCartsByIds(ids);
        if(rows==0)
            throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,"您要删除的商品不存在");
    }

    @Override
    public void removeAllCarts() {
        Long userId = getUserId();
        int rows = omsCartMapper.deleteCartsByUserId(userId);
        if (rows==0)
            throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,"您购物车中没有商品");
    }
    //生成订单时，删除订单中选中的商品，并不需要让用户看到，所以不用写controller
    @Override
    public void removeUserCarts(OmsCart omsCart) {
        omsCartMapper.deleteCartByUserIdAndSkuId(omsCart);
    }

    @Override
    public void updateQuantity(CartUpdateDTO cartUpdateDTO) {
        //修改购物车中商品的数量
        //需要做类型转换
        OmsCart omsCart = new OmsCart();
        BeanUtils.copyProperties(cartUpdateDTO,omsCart);
        omsCartMapper.updateQuantityById(omsCart);
    }
    //业务逻辑层获取用户信息的方法有很多，所有单独编写成一个方法
    //这个方法是SpringSecurity提供的登录用户的容器
    //我们先获得SpringSecurity用户容器，从容器中获得用户信息
    public CsmallAuthenticationInfo getUserInfo(){
        //获取SpringSecurity上下文对象
        UsernamePasswordAuthenticationToken token =
                (UsernamePasswordAuthenticationToken)
                        SecurityContextHolder.getContext().getAuthentication();
        //判断token是否为空，为空就是没有登录信息
        if(token==null)
            throw new CoolSharkServiceException(ResponseCode.UNAUTHORIZED,"没有登录信息");
        //如果token不为空，获取用户信息
        CsmallAuthenticationInfo userInfo = (CsmallAuthenticationInfo) token.getCredentials();
        //返回登录用户信息
        return userInfo;
    }
    //单独写一个获取userId的方法
    public Long getUserId(){
        return getUserInfo().getId();
    }
}
